home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
hity wydania
/
Ubuntu 9.10 PL
/
karmelkowy-koliberek-desktop-9.10-i386-PL.iso
/
casper
/
filesystem.squashfs
/
usr
/
share
/
system-config-printer
/
options.py
< prev
next >
Wrap
Text File
|
2009-10-19
|
14KB
|
395 lines
## system-config-printer
## Copyright (C) 2006, 2007, 2008 Red Hat, Inc.
## Copyright (C) 2008 Tim Waugh <twaugh@redhat.com>
## Copyright (C) 2006 Florian Festi <ffesti@redhat.com>
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
import gtk
def OptionWidget(name, v, s, on_change):
if isinstance(v, list):
# XXX
if isinstance(s, list):
for vv in v + s:
if not isinstance(vv, str): raise ValueError
return OptionSelectMany(name, v, s, on_change)
print v, s
raise NotImplemented
else:
if (isinstance(s, int) or
isinstance(s, float) or
(isinstance(s, tuple) and
len(s) == 2 and
((isinstance(s[0], int) and isinstance(s[1], int)) or
(isinstance(s[0], float) and isinstance(s[1], float))))):
try:
if (isinstance(s, int) or
isinstance(s, tuple) and isinstance(s[0], int)):
v = int(v)
else:
v = float(v)
except ValueError:
return OptionText(name, v, "", on_change)
return OptionNumeric(name, v, s, on_change)
elif isinstance(s, list):
for sv in s:
if not isinstance(sv, int):
return OptionSelectOne(name, v, s, on_change)
try:
v = int(v)
except ValueError:
return OptionSelectOne(name, v, s, on_change)
return OptionSelectOneNumber(name, v, s, on_change)
elif isinstance(s, str):
return OptionText(name, v, s, on_change)
else:
raise ValueError
# ---------------------------------------------------------------------------
class OptionInterface:
def get_current_value(self):
raise NotImplemented
def is_changed(self):
raise NotImplemented
class OptionAlwaysShown(OptionInterface):
# States
STATE_UNCHANGED=0
STATE_RESET=1
STATE_ADJUSTED=2
def __init__(self, name, ipp_type, system_default,
widget, button, combobox_map = None, use_supported = False):
self.name = name
self.widget = widget
self.button = button
if ipp_type == bool:
def bool_type (x):
if type (x) == str:
if x.lower () in ("false", "no", "off"):
return False
# Even the empty string is true.
return True
return bool (x)
ipp_type = bool_type
self.ipp_type = ipp_type
self.set_default (system_default)
self.combobox_map = combobox_map
if combobox_map != None and ipp_type == int:
model = self.widget.get_model ()
i = 0
dict = {}
iter = model.get_iter_first ()
while iter:
dict[combobox_map[i]] = model.get_value (iter, 0)
i += 1
iter = model.iter_next (iter)
self.combobox_dict = dict
self.use_supported = use_supported
self.reinit (None)
def set_default(self, system_default):
# For the media option, the system default depends on the printer's
# PageSize setting. This method allows the main module to tell us
# what that is.
self.system_default = self.ipp_type (system_default)
def reinit(self, original_value, supported=None):
"""Set the original value of the option and the supported choices.
The special value None for original_value resets the option to the
system default."""
if (supported != None and
self.use_supported):
if (type(self.widget) == gtk.ComboBox and
self.ipp_type == str):
model = self.widget.get_model ()
model.clear ()
for each in supported:
iter = model.append ()
model.set_value (iter, 0, each)
elif (type(self.widget) == gtk.ComboBox and
self.ipp_type == int and
self.combobox_map != None):
model = self.widget.get_model ()
model.clear ()
for each in supported:
iter = model.append ()
model.set_value (iter, 0, self.combobox_dict[each])
if original_value != None:
self.original_value = self.ipp_type (original_value)
self.set_widget_value (self.original_value)
self.button.set_sensitive (True)
else:
self.original_value = None
self.set_widget_value (self.system_default)
self.button.set_sensitive (False)
self.state = self.STATE_UNCHANGED
def set_widget_value(self, ipp_value):
t = type(self.widget)
if t == gtk.SpinButton:
return self.widget.set_value (ipp_value)
elif t == gtk.ComboBox:
if self.ipp_type == str and self.combobox_map == None:
model = self.widget.get_model ()
iter = model.get_iter_first ()
while (iter != None and
model.get_value (iter, 0) != ipp_value):
iter = model.iter_next (iter)
if iter:
self.widget.set_active_iter (iter)
else:
# It's an int.
if self.combobox_map:
index = self.combobox_map.index (ipp_value)
else:
index = ipp_value
return self.widget.set_active (index)
elif t == gtk.CheckButton:
return self.widget.set_active (ipp_value)
else:
raise NotImplemented
def get_widget_value(self):
t = type(self.widget)
if t == gtk.SpinButton:
# Ideally we would use self.widget.get_value() here, but
# it doesn't work if the value has been typed in and then
# the Apply button immediately clicked. To handle this,
# we use self.widget.get_text() and fall back to
# get_value() if the result cannot be interpreted as the
# type we expect.
try:
return self.ipp_type (self.widget.get_text ())
except ValueError:
# Can't convert result of get_text() to ipp_type.
return self.ipp_type (self.widget.get_value ())
elif t == gtk.ComboBox:
if self.combobox_map:
return self.combobox_map[self.widget.get_active()]
if self.ipp_type == str:
return self.widget.get_active_text ()
return self.ipp_type (self.widget.get_active ())
elif t == gtk.CheckButton:
return self.ipp_type (self.widget.get_active ())
print t
raise NotImplemented
def get_current_value(self):
return self.get_widget_value ()
def is_changed(self):
if self.original_value != None:
# There was a value set previously.
if self.state == self.STATE_RESET:
# It's been removed.
return True
if self.state == self.STATE_ADJUSTED:
if self.get_current_value () != self.original_value:
return True
return False
# The value is the same as before, and not reset.
return False
# There was no original value set.
if self.state == self.STATE_ADJUSTED:
# It's been adjusted.
return True
# It's been left alone, or possible adjusted and then reset.
return False
def reset(self):
self.set_widget_value (self.system_default)
self.state = self.STATE_RESET
self.button.set_sensitive (False)
def changed(self):
self.state = self.STATE_ADJUSTED
self.button.set_sensitive (True)
class OptionAlwaysShownSpecial(OptionAlwaysShown):
def __init__(self, name, ipp_type, system_default,
widget, button, combobox_map = None, use_supported = False,
special_choice = "System default"):
self.special_choice = special_choice
self.special_choice_shown = False
OptionAlwaysShown.__init__ (self, name, ipp_type, system_default,
widget, button,
combobox_map=combobox_map,
use_supported=use_supported)
def show_special_choice (self):
if self.special_choice_shown:
return
self.special_choice_shown = True
# Only works for ComboBox widgets
model = self.widget.get_model ()
iter = model.insert (0)
model.set_value (iter, 0, self.special_choice)
self.widget.set_active_iter (model.get_iter_first ())
def hide_special_choice (self):
if not self.special_choice_shown:
return
self.special_choice_shown = False
# Only works for ComboBox widgets
model = self.widget.get_model ()
model.remove (model.get_iter_first ())
def reinit(self, original_value, supported=None):
if original_value != None:
self.hide_special_choice ()
else:
self.show_special_choice ()
OptionAlwaysShown.reinit (self, original_value, supported=supported)
def reset(self):
self.show_special_choice ()
OptionAlwaysShown.reset (self)
def changed(self):
OptionAlwaysShown.changed (self)
if self.widget.get_active () > 0:
self.hide_special_choice ()
class Option(OptionInterface):
conflicts = None
def __init__(self, name, value, supported, on_change):
self.name = name
self.value = value
self.supported = supported
self.on_change = on_change
self.is_new = False
label = name
if not label.endswith (':'):
label += ':'
self.label = gtk.Label(label)
self.label.set_alignment(0.0, 0.5)
def get_current_value(self):
raise NotImplemented
def is_changed(self):
return (self.is_new or
str (self.get_current_value()) != str (self.value))
def changed(self, widget, *args):
self.on_change(self)
# ---------------------------------------------------------------------------
class OptionSelectOne(Option):
def __init__(self, name, value, supported, on_change):
Option.__init__(self, name, value, supported, on_change)
self.selector = gtk.combo_box_new_text()
selected = None
for nr, choice in enumerate(supported):
self.selector.append_text(str(choice))
if str (value) == str (choice):
selected = nr
if selected is not None:
self.selector.set_active(selected)
else:
print "Unknown value for %s: %s" % (name, value)
print "Choices:", supported
self.selector.connect("changed", self.changed)
def get_current_value(self):
return self.selector.get_active_text()
# ---------------------------------------------------------------------------
class OptionSelectOneNumber(OptionSelectOne):
def get_current_value(self):
return int(self.selector.get_active_text())
# ---------------------------------------------------------------------------
class OptionSelectMany(Option):
def __init__(self, name, value, supported, on_change):
Option.__init__(self, name, value, supported, on_change)
self.checkboxes = []
vbox = gtk.VBox()
for s in supported:
checkbox = gtk.CheckButton(label=s)
checkbox.set_active(s in value)
vbox.add(checkbox)
checkbox.connect("toggled", self.changed)
self.checkboxes.append(checkbox)
self.selector = vbox
def get_current_value(self):
return[s for s, chk in zip(self.supported, self.checkboxes)
if chk.get_active()]
# ---------------------------------------------------------------------------
class OptionNumeric(Option):
def __init__(self, name, value, supported, on_change):
self.is_float = (isinstance(supported, float) or
(isinstance(supported, tuple) and
isinstance(supported[0], float)))
if self.is_float:
digits = 2
else:
digits = 0
if not isinstance(supported, tuple):
supported = (0, supported)
Option.__init__(self, name, value, supported, on_change)
adj = gtk.Adjustment(value, supported[0], supported[1], 1.0, 5.0, 0.0)
self.selector = gtk.SpinButton(adj, climb_rate=1.0, digits=digits)
if not self.is_float:
self.selector.set_numeric(True)
self.selector.connect("changed", self.changed)
def get_current_value(self):
if self.is_float:
return self.selector.get_value()
return self.selector.get_value_as_int()
# ---------------------------------------------------------------------------
class OptionText(Option):
def __init__(self, name, value, supported, on_change):
Option.__init__(self, name, value, supported, on_change)
self.selector = gtk.Entry()
self.selector.set_text(value)
self.selector.connect("changed", self.changed)
def get_current_value(self):
return self.selector.get_text()